package com.tang.crm.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tang.crm.dto.CustomerReprieveDto;
import com.tang.crm.entity.Customer;
import com.tang.crm.entity.CustomerReprieve;
import com.tang.crm.mapper.CustomerLossMapper;
import com.tang.crm.mapper.CustomerReprieveMapper;
import com.tang.crm.service.CustomerReprieveService;
import com.tang.crm.utils.AssertUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class CustomerReprieveServiceImpl extends ServiceImpl<CustomerReprieveMapper, CustomerReprieve> implements CustomerReprieveService {

    @Autowired
    private CustomerReprieveMapper customerReprieveMapper;

    @Autowired
    private CustomerLossMapper customerLossMapper;

    /**
     * 分页条件查询流失客户暂缓操作的列表
     * @param customerReprieveDto
     * @return
     */
    @Override
    public Map<String, Object> selectByParams(CustomerReprieveDto customerReprieveDto) {
        Map<String, Object> map = new HashMap<>();
        Page<CustomerReprieve> page = new Page<>(customerReprieveDto.getPage(), customerReprieveDto.getLimit());
        IPage<Map<String, Object>> mapIPage = customerReprieveMapper.selectAllByParams(page, customerReprieveDto);
        map.put("code", 0);
        map.put("msg", "");
        map.put("count", mapIPage.getTotal());
        map.put("data", mapIPage.getRecords());
        return map;
    }

    /**
     * 添加暂缓数据
     *  1. 参数校验
     *      流失客户ID  lossId
     *          非空，数据存在
     *      暂缓措施内容 measure
     *          非空
     *  2. 设置参数的默认值
     *      是否有效
     *          默认有效，1
     *      创建时间
     *          系统当前时间
     *      修改时间
     *          系统当前时间
     *  3. 执行添加操作，判断受影响的行数
     * @param customerReprieve
     */
    @Override
    @Transactional
    public void addCustomerRepr(CustomerReprieve customerReprieve) {
        /* 1.参数校验 */
        checkParams(customerReprieve.getLossId(), customerReprieve.getMeasure());

        /* 2.设置参数的默认值 */
        customerReprieve.setIsValid(1);
        customerReprieve.setCreateDate(new Date());
        customerReprieve.setUpdateDate(new Date());

        /* 3.执行添加操作，判断受影响的行数 */
        AssertUtil.isTrue(customerReprieveMapper.insert(customerReprieve) != 1, "添加暂缓数据失败");
    }

    /**
     * 修改暂缓数据
     *  1. 参数校验
     *      主键ID    id
     *          非空，数据存在
     *      流失客户ID  lossId
     *          非空，数据存在
     *      暂缓措施内容 measure
     *          非空
     *  2. 设置参数的默认值
     *      修改时间
     *          系统当前时间
     *  3. 执行修改操作，判断受影响的行数
     * @param customerReprieve
     */
    @Override
    @Transactional
    public void updateCustomerRepr(CustomerReprieve customerReprieve) {
        /* 1.参数校验 */
        // 主键ID    id
        AssertUtil.isTrue(customerReprieve.getId() == null
                || customerReprieveMapper.selectById(customerReprieve.getId()) == null, "待更新记录不存在");
        checkParams(customerReprieve.getLossId(), customerReprieve.getMeasure());

        /* 2.设置参数的默认值 */
        customerReprieve.setUpdateDate(new Date());

        /* 3.执行修改操作，判断受影响的行数 */
        AssertUtil.isTrue(customerReprieveMapper.updateById(customerReprieve), "修改暂缓数据失败");
    }

    /**
     * 删除暂缓数据
     *  1. 判断id是否为空，且数据存在
     *  2. 设置isvalid为0
     *  3. 执行更新操作，判断受影响的行数
     * @param id
     */
    @Override
    public void deleteCustomerRepr(Integer id) {
        /* 1.判断id是否为空，且数据存在 */
        AssertUtil.isTrue(null == id, "待删除记录不存在");
        AssertUtil.isTrue(customerReprieveMapper.selectById(id) == null, "待删除记录不存在");

        /* 2.执行删除操作，判断受影响的行数*/
        AssertUtil.isTrue(customerReprieveMapper.deleteById(id) != 1, "删除暂缓数据失败");
    }

    /**
     * 参数校验
     * @param lossId
     * @param measure
     */
    public void checkParams(Integer lossId, String measure) {
        // 流失客户ID lossId    非空，数据存在
        AssertUtil.isTrue(lossId == null || customerLossMapper.selectById(lossId) == null, "流失客户记录不存在");
        // 暂缓措施内容 measure   非空
        AssertUtil.isTrue(StringUtils.isBlank(measure), "暂缓措施内容不能为空");
    }
}
